home *** CD-ROM | disk | FTP | other *** search
/ Super PC 34 / Super PC 34 (Shareware).iso / spc / UTIL / DJGPP2 / V2 / DJTST200.ZIP / tests / libc / ansi / stdio / fseek.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-02-05  |  7.3 KB  |  206 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <errno.h>
  5. #ifdef __DJGPP__
  6. #include <unistd.h>
  7. #include <crt0.h>
  8.  
  9. int _crt0_startup_flags = _CRT0_FLAG_DROP_EXE_SUFFIX;
  10. #endif
  11.  
  12. int errcode = 0;
  13.  
  14. void report_test_results (int as_expected)
  15. {
  16.   printf ("done\n====== the test %s.\n",
  17.           as_expected ? "SUCCEEDED :-)" : "FAILED :-(");
  18. }
  19.  
  20. void do_or_die (int failed, const char *msg)
  21. {
  22.   ++errcode;
  23.   if (failed)
  24.     {
  25.       perror (msg);
  26.       exit (errcode);
  27.     }
  28. }
  29.  
  30. /* Like fread(), but fills BUF with exactly ELSIZE*NELEMS bytes of text.  */
  31. size_t text_read (void *buf, size_t elsize, size_t nelems, FILE *fp)
  32. {
  33.   char   *bp = buf;
  34.   size_t to_read = elsize * nelems;
  35.   int    this_read = 0;
  36.  
  37.   errno = 0;
  38.  
  39.   while (to_read && !feof (fp) && !ferror (fp) && this_read != -1)
  40.     {
  41.       this_read = fread (bp, 1, to_read, fp);
  42.       if (this_read > -1)
  43.         {
  44.           bp += this_read;
  45.           to_read -= this_read;
  46.         }
  47.     }
  48.   return elsize * nelems - to_read;
  49. }
  50.  
  51. void
  52. diag(char *buf1, char *buf3, int buflen)
  53. {
  54.   int i;
  55.   for (i=0; i<buflen; i++)
  56.     printf(" %02x", buf1[i]);
  57.   printf("\n");
  58.   for (i=0; i<buflen; i++)
  59.     printf(" %02x", buf3[i]);
  60.   printf("\n");
  61. }
  62.  
  63. int main (int argc, char *argv[])
  64. {
  65.   char *source = (char *)malloc (strlen (*argv) + 3);
  66.  
  67.   if (source)
  68.     {
  69.       FILE *fp;
  70.       long flen, buflen;
  71.       char *buf1 = 0;
  72.       char *buf2 = 0;
  73.       char *buf3 = 0;
  74.       long fpos1 = 0;
  75.       int i;
  76.  
  77.       strcat (strcpy (source, *argv), ".c");
  78.  
  79.       printf ("**** Testing fseek/ftell in BINARY mode...\n");
  80.       do_or_die ((fp = fopen (source, "rb")) == 0, source);
  81.       flen = lseek (fileno (fp), 0, SEEK_END);
  82.       buflen = flen / 100;      /* assume this source is a few KB-long */
  83.       if (buflen < 20)
  84.         buflen = 20;
  85.       if (buflen > 60)
  86.         buflen = 60;
  87.       errno = ENOMEM;
  88.       do_or_die ((buf1 = (char *)malloc (buflen)) == 0
  89.                  || (buf2 = (char *)malloc (buflen)) == 0
  90.                  || (buf3 = (char *)malloc (buflen)) == 0,
  91.                  "allocate buffers");
  92.  
  93.       printf ("------ testing fseek() to beginning of file...");
  94.       lseek (fileno (fp), 0, SEEK_SET);
  95.       setvbuf (fp, (char *)0, _IOFBF, buflen * 3);
  96.       do_or_die (fread (buf1, 1, buflen, fp) < buflen,
  97.                  "fread buffer-1 at 0 offset");
  98.       for (i = 0; i < 5; i++)
  99.         {
  100.           do_or_die (fread (buf3, 1, buflen, fp) < buflen,
  101.                      "move 5 buffers' worth from the beginning");
  102.           if (i == 3)
  103.             do_or_die ((fpos1 = ftell (fp)) < 0, "get pos1");
  104.         }
  105.       do_or_die (fseek (fp, 0, SEEK_SET), "seek to beginning");
  106.       do_or_die (fread (buf2, 1, buflen, fp) < buflen,
  107.                  "fread buffer-2 at (presumably) 0 offset");
  108.       report_test_results (memcmp (buf1, buf2, buflen) == 0);
  109.  
  110.       printf ("------ testing fseek() to end of file...");
  111.       do_or_die (fseek (fp, 0, SEEK_END), "seek to EOF");
  112.       report_test_results (fgetc (fp) == EOF);
  113.  
  114.       printf ("------ testing fseek() to a position returned by ftell()...");
  115.       do_or_die (fseek (fp, fpos1, SEEK_SET), "seek into the file");
  116.       do_or_die (fread (buf1, 1, buflen, fp) < buflen,
  117.                  "fread buffer-1 at position reported by ftell");
  118.       report_test_results (memcmp (buf1, buf3, buflen) == 0);
  119.  
  120.       printf ("------ testing fseek() to current position...");
  121.       do_or_die (fseek (fp, 0, SEEK_SET), "seek to beginning");
  122.       do_or_die (fread (buf1, 1, buflen, fp) < buflen,
  123.                  "fread buffer-1 at (presumably) 0 offset");
  124.       do_or_die (fread (buf2, 1, buflen, fp) < buflen,
  125.                  "fread buffer-2 after buffer-1");
  126.       do_or_die (fseek (fp, 0, SEEK_SET), "seek to beginning");
  127.       do_or_die (fread (buf1, 1, buflen, fp) < buflen,
  128.                  "fread buffer-1 at (presumably) 0 offset");
  129.       do_or_die (fseek (fp, 0, SEEK_CUR), "seek to current pos");
  130.       do_or_die (fread (buf3, 1, buflen, fp) < buflen,
  131.                  "fread buffer-3 after buffer-1");
  132.       report_test_results (memcmp (buf2, buf3, buflen) == 0);
  133.  
  134.       do_or_die (fclose (fp), source);
  135.  
  136.  
  137.       printf ("\n**** Testing fseek/ftell in TEXT mode...\n");
  138.       do_or_die ((fp = fopen (source, "rt")) == 0, source);
  139.       setvbuf (fp, (char *)0, _IOFBF, buflen * 3);
  140.  
  141.       printf ("------ testing fseek() to beginning of file...");
  142.       do_or_die (text_read (buf1, 1, buflen, fp) < buflen,
  143.                  "text_read buffer-1 at 0 offset");
  144.       for (i = 0; i < 5; i++)
  145.         {
  146.           do_or_die (text_read (buf3, 1, buflen, fp) < buflen,
  147.                      "move 5 buffers' worth from the beginning");
  148.           if (i == 3)
  149.       {
  150.             do_or_die ((fpos1 = ftell (fp)) < 0, "get pos1");
  151.       }
  152.         }
  153.       do_or_die (fseek (fp, 0, SEEK_SET), "seek to beginning");
  154.       do_or_die (text_read (buf2, 1, buflen, fp) < buflen,
  155.                  "text_read buffer-2 at (presumably) 0 offset");
  156.       report_test_results (memcmp (buf1, buf2, buflen) == 0);
  157.  
  158.       printf ("------ testing fseek() to end of file...");
  159.       do_or_die (fseek (fp, 0, SEEK_END), "seek to EOF");
  160.       report_test_results (fgetc (fp) == EOF);
  161.  
  162.       /* Do this twice: for file positions inside and outside of the
  163.          current buffered portion of the file.  */
  164.       printf ("------ testing fseek() to a place returned by ftell()=0x%lx [1]...", fpos1);
  165.       do_or_die (fseek (fp, fpos1, SEEK_SET), "seek into the file");
  166.       do_or_die (text_read (buf1, 1, buflen, fp) < buflen,
  167.                  "text_read buffer-1 at position reported by ftell");
  168.       report_test_results (memcmp (buf1, buf3, buflen) == 0);
  169.       if (memcmp(buf1, buf3, buflen))
  170.     diag(buf1, buf3, buflen);
  171.  
  172.       printf ("------ testing fseek() to a place returned by ftell()=0x%lx [2]...", fpos1);
  173.       do_or_die (fseek (fp, 0, SEEK_SET), "seek to beginning");
  174.       for (i = 0; i < 5; i++)
  175.         do_or_die (text_read (buf1, 1, buflen, fp) < buflen,
  176.                    "move 5 buffers' worth from the beginning");
  177.       do_or_die (fseek (fp, fpos1, SEEK_SET), "seek into the file");
  178.       do_or_die (text_read (buf1, 1, buflen, fp) < buflen,
  179.                  "text_read buffer-1 at position reported by ftell");
  180.       report_test_results (memcmp (buf1, buf3, buflen) == 0);
  181.       if (memcmp(buf1, buf3, buflen))
  182.     diag(buf1, buf3, buflen);
  183.  
  184.       printf ("------ testing fseek() to current position...");
  185.       do_or_die (fseek (fp, 0, SEEK_SET), "seek to beginning");
  186.       do_or_die (text_read (buf1, 1, buflen, fp) < buflen,
  187.                  "text_read buffer-1 at (presumably) 0 offset");
  188.       do_or_die (text_read (buf2, 1, buflen, fp) < buflen,
  189.                  "text_read buffer-2 after buffer-1");
  190.       do_or_die (fseek (fp, 0, SEEK_SET), "seek to beginning");
  191.       do_or_die (text_read (buf1, 1, buflen, fp) < buflen,
  192.                  "text_read buffer-1 at (presumably) 0 offset");
  193.       do_or_die (fseek (fp, 0, SEEK_CUR), "seek to current pos");
  194.       do_or_die (text_read (buf3, 1, buflen, fp) < buflen,
  195.                  "text_read buffer-3 after buffer-1");
  196.       report_test_results (memcmp (buf2, buf3, buflen) == 0);
  197.  
  198.       do_or_die (fclose (fp), source);
  199.       return 0;
  200.     }
  201.  
  202.   errno = ENOMEM;
  203.   perror ("buffer for source filename");
  204.   return ++errcode;
  205. }
  206.